import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.Identity;
import java.util.Properties;

import com.ckjw.gobang.connect.Message;
import com.ckjw.gobang.connect.MessageType;
import com.ckjw.gobang.connect.User;
import com.ckjw.gobang.jdbc.DataBaseControl;
import com.ckjw.gobang.jdbc.JDBCUtils;
import com.ckjw.gobang.jdbc.test;

/*** 
* 启动服务器，验证用户登录，并分发线程类
*监听9998
* @author  李传开
* @Date    Jun 12, 2022
 */
public class QQServer {
    private ServerSocket ss = null;
   
    public QQServer() {
        try {
            //读取配置文件
            String path=JDBCUtils.getPath(new test())+"/serverSeeting.properties";
            //System.out.println(path);
            Properties pros = new Properties();
            InputStream is = new FileInputStream(path);
            pros.load(is);
            String port = pros.getProperty("port");

            System.out.println("服务端在"+port+"端口监听...");
            ss = new ServerSocket(Integer.parseInt(port));
            while (true) { //当和某个客户端连接后，会继续监听, 因此while
                  
                Socket socket = ss.accept();//如果没有客户端连接，就会阻塞在这里
                //得到socket关联的对象输入流
                ObjectInputStream ois =
                        new ObjectInputStream(socket.getInputStream());

                //得到socket关联的对象输出流
                ObjectOutputStream oos =
                        new ObjectOutputStream(socket.getOutputStream());
                System.out.println(socket);
                User u=(User) ois.readObject();
                //创建一个Message对象，准备回复客户端
               Message message=new Message();
                //验证用户 方法
                if (DataBaseControl.checkUser(u.getUserId(), u.getPasswd())&&u.getName()==null&&ManageClientThreads.getHm().get(u.getUserId())==null ) {
                    System.out.println( u.getUserId()+"登录通过");
                    //登录通过
                   message.setMesType(MessageType.MESSAGE_LOGIN_SUCCEED);
                   //将message对象回复客户端
                    oos.writeObject(message);
                    //创建一个线程，和客户端保持通信, 该线程需要持有socket对象
                    ServerConnectClientThread serverConnectClientThread =
                            new ServerConnectClientThread(socket, u.getUserId());
                   
                    //启动该线程
                    serverConnectClientThread.start();
                    //把该线程对象，放入到一个集合中，进行管理.
                    ManageClientThreads.addClientThread(u.getUserId(), serverConnectClientThread);
                     //给所有在线客户端发送刷新信息
                     ManageClientThreads.refresh();

                } else if(u.getName()!=null)//注册请求
                {
                    //获取注册信息
                    String id=u.getUserId();
                    String name=u.getName();
                    String passwd=u.getPasswd();
                    System.out.println("注册请求：id："+id+"  name："+name+"  passwd："+passwd);
                    //调用注册函数返回注册结果
                    boolean result=DataBaseControl.adduser(id, name, passwd);
                    //构建一个Message 对象，返回给客户端
                    Message message2 = new Message();
                    message2.setMesType(MessageType.MESSAGE_REG);
                    message2.setContent(""+result);
                    oos.writeObject(message2);
                   
                } 
                else { // 登录失败
                    System.out.println("用户 id=" + u.getUserId() + " pwd=" + u.getPasswd() + " 验证失败");
                    message.setMesType(MessageType.MESSAGE_LOGIN_FAIL);
                    oos.writeObject(message);
                    //关闭socket
                    socket.close();
                }

            }
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            //如果服务器退出了while，说明服务器端不在监听，因此关闭ServerSocket
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
